package com.woniuxy.sddfp.system.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
import com.woniuxy.bank.api.access.TradeLogApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 * 用户详情表 前端控制器
 * </p>
 *
 * @author yellow doctor
 * @since 2025-06-23
 */
@RestController
@RequestMapping("/show")
public class TestPortController {

    @Autowired
    private TradeLogApi tradeLogApi;

    @GetMapping("/port")
    public String testPort(){
        return tradeLogApi.testPort();
    }

    /**
     *   服务降级的目的:
     *       在微服务中 服务之间的调用 防止 请求堆积 引起的 雪崩
     *
     * @param id
     * @return
     * @throws Exception
     */
    @GetMapping("/demo/{id}")
    @HystrixCommand(fallbackMethod = "fallbackDemo")
    public String testDemo(@PathVariable("id") Integer id) throws Exception {

        if (id == 10){
            throw new Exception();  //这里是失败
        }
        return "这里访问OK....";   //这里正常的执行

    }

    //fallback method wasn't found: fallbackDemo([class java.lang.Integer])
    public String fallbackDemo(@PathVariable("id") Integer id){
        return "这里是服务降级....";
    }

    /**
     *  服务熔断
     * @param id
     * @return
     */
    @GetMapping("find/{id}")
    @HystrixCommand(fallbackMethod = "errorFallback",commandProperties = {
            // 是否开启断路器
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),
            // 请求错误率大于 50% 就启动熔断器
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "50"),
            // 默认10秒内访问接口达到20次，且错误率大于50%则打开断路器，触发熔断； 为了方便测试，这里修改请求数为10
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),
            //断路多久以后开始尝试是否恢复，默认5s
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000")
    })
    public String findMemberById(@PathVariable("id")Integer id) {
        if (id<0) {
            throw new RuntimeException("id不能为负数");
        }
        return Thread.currentThread().getName() + " 调用成功";
    }

    // 默认降级方法，返回string
    public String errorFallback(@PathVariable("id")Integer id){
        return "默认降级方法";
    }
}
